//测试 promise 内部 n 层 promise 的执行效果
let middlewares = [];
function use(fn){
    middlewares.push(fn);
}

use(async (next)=>{
    console.log('我是第 1 个中间件 before');
    await next();
    console.log('我是第 1 个中间件 after');
});

use(async (next)=>{
    console.log('我是第 2 个中间件 before');
    await next();
    console.log('我是第 2 个中间件 after');
});

use(async (next)=>{
    console.log('我是第 3 个中间件 before');
    await next();
    console.log('我是第 3 个中间件 after');
});

function callback(next){
    return dispatch(0);
    function dispatch(i){
        let fn = middlewares[i];
        if(i==middlewares.length){
            fn = next;
        }

        //fn 无值直接返回
        if(!fn) return Promise.resolve();

        try{
            return Promise.resolve(fn(dispatch.bind(null, i+1)));
        }catch(err){
            return Promise.reject(err);
        }
    }
}

callback();